---
sidebar_position: 3
---

import FolderView from '@site/src/components/FolderView';

# i18n 国际化指南

## 注册插件的 i18n \{#registering-i18n-for-plugins}

以 ExamplePlugin-Maven 项目为例。

需要在插件入口主类注册 i18n

```java title="ExamplePlugin.java"
package cn.nukkitmot.exampleplugin;

import cn.nukkit.lang.PluginI18n;
import cn.nukkit.lang.PluginI18nManager;
import cn.nukkit.plugin.PluginBase;

public class ExamplePlugin extends PluginBase {
    public static ExamplePlugin INSTANCE;   
    public static PluginI18n I18N;
    public static LangCode serverLangCode;

    @Override
    public void onLoad() {
        // 保存插件的 Instance
        INSTANCE = this;
        // 注册插件的 i18n
        I18N = PluginI18nManager.register(this);
        initServerLangCode();
    }
    
    public void initServerLangCode() {
        switch (Server.getInstance().getLanguage().getLang()) {
            case "eng" -> {
                serverLangCode = LangCode.en_US;
            }
            case "chs" -> {
                serverLangCode = LangCode.zh_CN;
            }
            case "deu" -> {
                serverLangCode = LangCode.de_DE;
            }
            case "rus" -> {
                serverLangCode = LangCode.ru_RU;
            }
            default -> {
                try {
                    serverLangCode = LangCode.valueOf(Server.getInstance().getLanguage().getLang());
                } catch (IllegalArgumentException e) {
                    serverLangCode = LangCode.en_US;
                }
            }
        }
    }
}
```

下面我将用 `PlayerLocallyInitializedEvent` 来演示如何使用：

```java title="EventListener.java"
package cn.nukkitmot.exampleplugin;

import cn.nukkit.Server;
import cn.nukkit.Player;
import cn.nukkit.lang.LangCode;
import cn.nukkit.event.player.PlayerLocallyInitializedEvent;

import static cn.nukkitmot.exampleplugin.ExamplePlugin.INSTANCE;
import static cn.nukkitmot.exampleplugin.ExamplePlugin.I18N;
import static cn.nukkitmot.exampleplugin.ExamplePlugin.serverLangCode;

public class EventListener implements Listener {
    @EventHandler
    public void joinEvent(PlayerLocallyInitializedEvent event) {
        Player player = event.getPlayer();
        LangCode playerLangCode = player.getLanguageCode();
        // 这是获取玩家 LangCode
        player.sendMessage(I18N.tr(playerLangCode, "exampleplugin.helloworld", playerName));
        // 我们还可以获取服务器的 LangCode
        INSTANCE.getLogger().info(I18N.tr(serverLangCode, "exampleplugin.helloworld", playerName));
    }
}
```

## 添加语言文件至资源 \{#adding-language-files-to-resources}

而后我们需要在 `src/main/resources` 文件夹下新建 `language` 文件夹来存储 **\<[LangCode](#langcode)\>.lang** 语言文件，您的插件开发目录大致如下

<FolderView
    paths={[
    'ExamplePlugin-Maven/lib',
    'ExamplePlugin-Maven/src/main/java',
    'ExamplePlugin-Maven/src/main/resources/language/en_US.lang',
    'ExamplePlugin-Maven/target',
]}
>
</FolderView>

### 语言文件格式 \{#language-files-format}

支持参数的多语言文本，例如 `exampleplugin.helloworld=你好 {%0}!`

\{%n\} 将填充索引为 n 的参数

```ini
exampleplugin.helloworld=你好 {%0}!
exampleplugin.examplecommand.description=这是一个测试命令。
```

## LangCode \{#langcode}

语言代码可见 [cn.nukkit.lang.LangCode](https://github.com/MemoriesOfTime/Nukkit-MOT/blob/master/src/main/java/cn/nukkit/lang/LangCode.java)，在此列出表格以便使用:

| LangCode | 语言 | 地区 |
|---------|------|------|
| en_US   | English | United States |
| en_GB   | English | United Kingdom |
| de_DE   | Deutsch | Deutschland |
| es_ES   | Español | España |
| es_MX   | Español | México |
| fr_FR   | Français | France |
| fr_CA   | Français | Canada |
| it_IT   | Italiano | Italia |
| ja_JP   | 日本語 | 日本 |
| ko_KR   | 한국어 | 대한민국 |
| pt_BR   | Português | Brasil |
| pt_PT   | Português | Portugal |
| ru_RU   | Русский | Россия |
| zh_CN   | 中文(简体) | 中国 |
| zh_TW   | 中文(繁體) | 中国台湾 |
| nl_NL   | Nederlands | Nederland |
| bg_BG   | Български | България |
| cs_CZ   | Čeština | Česko |
| da_DK   | Dansk | Danmark |
| el_GR   | Ελληνικά | Ελλάδα |
| fi_FI   | Suomi | Suomi |
| hu_HU   | Magyar | Magyarország |
| id_ID   | Indonesia | Indonesia |
| nb_NO   | Norsk bokmål | Norge |
| pl_PL   | Polski | Polska |
| sk_SK   | Slovenčina | Slovensko |
| sv_SE   | Svenska | Sverige |
| tr_TR   | Türkçe | Türkiye |
| uk_UA   | Українська | Україна |